package com.shi.ergodic;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.function.Consumer;

public class Demo01 {
    public static void main(String[] args) {
        //单列集合
        ArrayList<String> list = new ArrayList();

        list.add("a");
        list.add("b");
        list.add("c");

        //1.普通for循环遍历
        System.out.println("1.普通for循环遍历");
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }

        //2.增强for循环遍历
        System.out.println("2.增强for循环遍历");
        for(String str : list){
            System.out.println(str);
        }

        //3.迭代器遍历
        System.out.println("3.迭代器遍历");
        Iterator iterator = list.iterator();

        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }

        //4.foreach遍历
        System.out.println("4.foreach遍历");
        list.forEach(new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println(s);
            }
        });

        //5.lambda表达式(完整版)
        System.out.println("5.lambda表达式（完整版）");
        list.forEach((String s) -> {
            System.out.println(s);
        });

        //(简化版)
        /**
         * 1.省略参数类型：如果Lambda表达式的参数列表中只有一个参数，
         * 并且该参数的类型可以根据上下文推断出来，则可以省略参数类型。
         * (String x) -> x + 1
         * (x) -> x + 1
         * 2.省略参数括号：如果Lambda表达式的参数列表中只有一个参数，则可以省略参数括号。
         * 复制代码
         * (x) -> x + 1
         * x -> x + 1
         * 3.省略花括号：如果Lambda表达式的函数体中只有一条语句，则可以省略花括号。
         * 复制代码
         * x -> {System.out.println(x)}
         * x -> System.out.println(x)
         * 4.省略return关键字：如果Lambda表达式的函数体中只有一条语句，
         * 并且该语句的结果可以直接返回，则可以省略return关键字。
         * (x,y) - > return x+y
         * (x, y) -> x + y
         * 5.方法引用：如果Lambda表达式的函数体中只是调用了某个方法或构造函数，则可以使用方法引用来简化代码
         * x -> System.out.println(x)
         * System.out::println
         * 需要注意的是，Lambda表达式只能用于函数式接口的实现，
         * 即只有一个抽象方法的接口
         */
        System.out.println("5.lambda表达式（简化版）");
        list.forEach((System.out::println));

        //6.String流
        System.out.println("6.String流遍历（完整版）");
        list.stream().forEach((String s) -> {
            System.out.println(s);
        });

        //String流(简化版)
        System.out.println("6.String流遍历（简化版）");
        list.stream().forEach(System.out::println);

    }
}
